home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / base / g.py < prev    next >
Text File  |  2008-10-13  |  12KB  |  305 lines

  1. # -*- coding: utf-8 -*-
  2. #
  3. # (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  18. #
  19. # Author: Don Welch
  20. #
  21. # NOTE: This module is safe for 'from g import *'
  22. #
  23.  
  24. # Std Lib
  25. import sys
  26. import os
  27. import os.path
  28. import ConfigParser
  29. import locale
  30. import pwd
  31. import stat
  32.  
  33. # Local
  34. from codes import *
  35. import logger
  36.  
  37. # System wide logger
  38. log = logger.Logger('', logger.Logger.LOG_LEVEL_INFO, logger.Logger.LOG_TO_CONSOLE)
  39. log.set_level('info')
  40.  
  41. MINIMUM_PYQT_MAJOR_VER = 3
  42. MINIMUM_PYQT_MINOR_VER = 14
  43. MINIMUM_QT_MAJOR_VER = 3
  44. MINIMUM_QT_MINOR_VER = 0
  45.  
  46. def to_bool(s, default=False):
  47.     if isinstance(s, str) and s:
  48.         if s[0].lower() in ['1', 't', 'y']:
  49.             return True
  50.         elif s[0].lower() in ['0', 'f', 'n']:
  51.             return False
  52.     elif isinstance(s, bool):
  53.         return s
  54.  
  55.     return default
  56.  
  57. # System wide properties
  58. class Properties(dict):
  59.  
  60.     def __getattr__(self, attr):
  61.         if attr in self.keys():
  62.             return self.__getitem__(attr)
  63.         else:
  64.             return ""
  65.  
  66.     def __setattr__(self, attr, val):
  67.         self.__setitem__(attr, val)
  68.  
  69. prop = Properties()
  70.  
  71.  
  72. # User config file
  73. class ConfigSection(dict):
  74.     def __init__(self, section_name, config_obj, filename, *args, **kwargs):
  75.         dict.__setattr__(self, "section_name", section_name)
  76.         dict.__setattr__(self, "config_obj", config_obj)
  77.         dict.__setattr__(self, "filename", filename)
  78.         dict.__init__(self, *args, **kwargs)
  79.  
  80.     def __getattr__(self, attr):
  81.         if attr in self.keys():
  82.             return self.__getitem__(attr)
  83.         else:
  84.             return ""
  85.  
  86.     def __setattr__(self, option, val):
  87.         self.__setitem__(option, val)
  88.         if not self.config_obj.has_section(self.section_name):
  89.             self.config_obj.add_section(self.section_name)
  90.  
  91.         self.config_obj.set(self.section_name, option, val)
  92.         
  93.         try:
  94.             f = file(self.filename, 'w')
  95.             self.config_obj.write(f)
  96.             f.close()
  97.         except IOError:
  98.             pass
  99.  
  100.  
  101. class Config(dict):
  102.     def __init__(self, filename, error_if_not_found=False, *args, **kwargs):
  103.         dict.__init__(self, *args, **kwargs)
  104.         dict.__setattr__(self, "config_obj", ConfigParser.ConfigParser())
  105.         dict.__setattr__(self, "filename", filename)
  106.  
  107.         log.debug("Reading config file %s" % filename)
  108.  
  109.         try:
  110.             f = file(filename, 'r')
  111.             self.config_obj.readfp(f)
  112.             f.close()
  113.         except ConfigParser.Error:
  114.             log.error("There is an error in the config file: %s" % filename)
  115.             sys.exit(1)
  116.         except IOError:
  117.             pass
  118.  
  119.         for s in self.config_obj.sections():
  120.             opts = []
  121.             for o in self.config_obj.options(s):
  122.                 opts.append((o, self.config_obj.get(s, o)))
  123.  
  124.             self.__setitem__(s, ConfigSection(s, self.config_obj, filename, opts))
  125.  
  126.     def __getattr__(self, sect):
  127.         if sect not in self.keys():
  128.             self.__setitem__(sect, ConfigSection(sect, self.config_obj, self.filename))
  129.  
  130.         return self.__getitem__(sect)
  131.  
  132.     def __setattr__(self, sect, val):
  133.         self.__setitem__(sect, val)
  134.  
  135. # Config file: directories and ports
  136. prop.sys_config_file = '/etc/hp/hplip.conf'
  137. prop.user_dir = os.path.expanduser('~/.hplip')
  138.  
  139. os.umask(0037)
  140. try:
  141.     if not os.path.exists(prop.user_dir):
  142.         os.makedirs(prop.user_dir)
  143. except OSError:
  144.     pass # This is sometimes OK, if running hpfax: for example
  145.     
  146. prop.user_config_file = os.path.join(prop.user_dir, 'hplip.conf')
  147.  
  148. if not os.path.exists(prop.user_config_file):
  149.     try:
  150.         file(prop.user_config_file, 'w').close()
  151.         s = os.stat(os.path.dirname(prop.user_config_file))
  152.         os.chown(prop.user_config_file, s[stat.ST_UID], s[stat.ST_GID])
  153.     except IOError:
  154.         pass
  155.     
  156. sys_cfg = Config(prop.sys_config_file, True)
  157. user_cfg = Config(prop.user_config_file)
  158.  
  159.  
  160. # Language settings
  161. try:
  162.     prop.locale, prop.encoding = locale.getdefaultlocale()
  163. except ValueError:
  164.     prop.locale = 'en_US'
  165.     prop.encoding = 'UTF8'
  166.     
  167. prop.version = sys_cfg.hplip.version or 'x.x.x'
  168. prop.home_dir = sys_cfg.dirs.home or os.path.realpath(os.path.normpath(os.getcwd()))
  169. prop.username = pwd.getpwuid(os.getuid())[0]
  170. pdb = pwd.getpwnam(prop.username)
  171. prop.userhome = pdb[5]
  172.  
  173. prop.data_dir = os.path.join(prop.home_dir, 'data')
  174. prop.image_dir = os.path.join(prop.home_dir, 'data', 'images')
  175. prop.xml_dir = os.path.join(prop.home_dir, 'data', 'xml')
  176. prop.models_dir = os.path.join(prop.home_dir, 'data', 'models')
  177. prop.localization_dir = os.path.join(prop.home_dir, 'data', 'localization')
  178.  
  179. prop.max_message_len = 8192
  180. prop.max_message_read = 65536
  181. prop.read_timeout = 90
  182.  
  183. prop.ppd_search_path = '/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'
  184. prop.ppd_search_pattern = 'HP-*.ppd.*'
  185. prop.ppd_download_url = 'http://www.linuxprinting.org/ppd-o-matic.cgi'
  186. prop.ppd_file_suffix = '-hpijs.ppd'
  187.  
  188. # Build and install configurations
  189. prop.gui_build = to_bool(sys_cfg.configure.get('gui-build', '0'))
  190. prop.net_build = to_bool(sys_cfg.configure.get('network-build', '0'))
  191. prop.par_build = to_bool(sys_cfg.configure.get('pp-build', '0'))
  192. prop.usb_build = True 
  193. prop.scan_build = to_bool(sys_cfg.configure.get('scanner-build', '0'))
  194. prop.fax_build = to_bool(sys_cfg.configure.get('fax-build', '0'))
  195. prop.doc_build = to_bool(sys_cfg.configure.get('doc-build', '0'))
  196. prop.foomatic_xml_install = to_bool(sys_cfg.configure.get('foomatic-xml-install', '0'))
  197. prop.foomatic_ppd_install = to_bool(sys_cfg.configure.get('foomatic-ppd-install', '0'))
  198.  
  199. # Spinner, ala Gentoo Portage
  200. spinner = "\|/-\|/-"
  201. spinpos = 0
  202.  
  203. def update_spinner():
  204.     global spinner, spinpos
  205.     if not log.is_debug() and sys.stdout.isatty():
  206.         sys.stdout.write("\b" + spinner[spinpos])
  207.         spinpos=(spinpos + 1) % 8
  208.         sys.stdout.flush()
  209.  
  210. def cleanup_spinner():
  211.     if not log.is_debug() and sys.stdout.isatty():
  212.         sys.stdout.write("\b \b")
  213.         sys.stdout.flush()
  214.  
  215.  
  216. # Internal/messaging errors
  217.  
  218. ERROR_STRINGS = {
  219.                 ERROR_SUCCESS : 'No error',
  220.                 ERROR_UNKNOWN_ERROR : 'Unknown error',
  221.                 ERROR_DEVICE_NOT_FOUND : 'Device not found',
  222.                 ERROR_INVALID_DEVICE_ID : 'Unknown/invalid device-id field',
  223.                 ERROR_INVALID_DEVICE_URI : 'Unknown/invalid device-uri field',
  224.                 #ERROR_INVALID_MSG_TYPE : 'Unknown message type',
  225.                 #ERROR_INVALID_DATA_ENCODING : 'Unknown data encoding',
  226.                 #ERROR_INVALID_CHAR_ENCODING : 'Unknown character encoding',
  227.                 ERROR_DATA_LENGTH_EXCEEDS_MAX : 'Data length exceeds maximum',
  228.                 #ERROR_DATA_LENGTH_MISMATCH : "Data length doesn't match length field",
  229.                 #ERROR_DATA_DIGEST_MISMATCH : "Digest of data doesn't match digest field",
  230.                 #ERROR_INVALID_JOB_ID : 'Invalid job-id',
  231.                 ERROR_DEVICE_IO_ERROR : 'Device I/O error',
  232.                 #ERROR_STRING_QUERY_FAILED : 'String/error query failed',
  233.                 #ERROR_QUERY_FAILED : 'Query failed',
  234.                 #ERROR_GUI_NOT_AVAILABLE : 'hpguid not running',
  235.                 #ERROR_NO_CUPS_DEVICES_FOUND : 'No CUPS devices found (deprecated)',
  236.                 ERROR_NO_PROBED_DEVICES_FOUND : 'No probed devices found',
  237.                 #ERROR_INVALID_BUS_TYPE : 'Invalid bus type',
  238.                 #ERROR_BUS_TYPE_CANNOT_BE_PROBED : 'Bus cannot be probed',
  239.                 ERROR_DEVICE_BUSY : 'Device busy',
  240.                 #ERROR_NO_DATA_AVAILABLE : 'No data avaiable',
  241.                 #ERROR_INVALID_DEVICEID : 'Invalid/missing DeviceID',
  242.                 #ERROR_INVALID_CUPS_VERSION : 'Invlaid CUPS version',
  243.                 #ERROR_CUPS_NOT_RUNNING : 'CUPS not running',
  244.                 ERROR_DEVICE_STATUS_NOT_AVAILABLE : 'DeviceStatus not available',
  245.                 #ERROR_DATA_IN_SHORT_READ: 'ChannelDataIn short read',
  246.                 ERROR_INVALID_SERVICE_NAME : 'Invalid service name',
  247.                 #ERROR_INVALID_USER_ERROR_CODE : 'Invalid user level error code',
  248.                 ERROR_ERROR_INVALID_CHANNEL_ID : 'Invalid channel-id (service name)',
  249.                 ERROR_CHANNEL_BUSY : 'Channel busy',
  250.                 #ERROR_CHANNEL_CLOSE_FAILED : 'ChannelClose failed. Channel not open',
  251.                 #ERROR_UNSUPPORTED_BUS_TYPE : 'Unsupported bus type',
  252.                 ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION : 'Device does not support operation',
  253.                 #ERROR_DEVICE_NOT_OPEN : 'Device not open',
  254.                 #ERROR_UNABLE_TO_CONTACT_SERVICE : 'Unable to contact service',
  255.                 #ERROR_UNABLE_TO_BIND_SOCKET : 'Unable to bind to socket',
  256.                 ERROR_DEVICEOPEN_FAILED : 'Device open failed',
  257.                 ERROR_INVALID_DEVNODE : 'Invalid device node',
  258.                 #ERROR_TEST_EMAIL_FAILED : "Email test failed",
  259.                 ERROR_INVALID_HOSTNAME : "Invalid hostname ip address",
  260.                 ERROR_INVALID_PORT_NUMBER : "Invalid JetDirect port number",
  261.                 #ERROR_INTERFACE_BUSY : "Interface busy",
  262.                 ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE : "No CUPS queue found for device.",
  263.                 #ERROR_UNSUPPORTED_MODEL : "Unsupported printer model.",
  264.                 #ERROR_INVALID_GUI_NAME: "Invalid GUI",
  265.                 ERROR_DATFILE_ERROR: "DAT file error",
  266.                 ERROR_INVALID_TIMEOUT: "Invalid timeout",
  267.                 ERROR_IO_TIMEOUT: "I/O timeout",
  268.                 ERROR_FAX_INCOMPATIBLE_OPTIONS: "Incompatible fax options",
  269.                 ERROR_FAX_INVALID_FAX_FILE: "Invalid fax file",
  270.                 #ERROR_FAX_MUST_RUN_SENDFAX_FIRST: "Run sendfax first",
  271.                 #ERROR_FAX_PROCESSING: "Fax processing",
  272.                 #ERROR_FAX_READY: "Fax ready",
  273.                 ERROR_FAX_FILE_NOT_FOUND: "Fax file not found",
  274.                 ERROR_INTERNAL : 'Unknown internal error',
  275.                }
  276.                
  277.  
  278. class Error(Exception):
  279.     def __init__(self, opt=ERROR_INTERNAL):
  280.         self.opt = opt
  281.         self.msg = ERROR_STRINGS.get(opt, ERROR_STRINGS[ERROR_INTERNAL])
  282.         log.debug("Exception: %d (%s)" % (opt, self.msg))
  283.         Exception.__init__(self, self.msg, opt)
  284.  
  285.  
  286. # Make sure True and False are avail. in pre-2.2 versions
  287. try:
  288.     True
  289. except NameError:
  290.     True = (1==1)
  291.     False = not True
  292.  
  293. # as new translations are completed, add them here
  294. supported_locales =  { 'en_US': ('us', 'en', 'en_us', 'american', 'america', 'usa', 'english'),
  295.                        'zh_CN': ('zh', 'cn', 'zh_cn' , 'china', 'chinese', 'prc'),
  296.                        'de_DE': ('de', 'de_de', 'german', 'deutsche'),
  297.                        'fr_FR': ('fr', 'fr_fr', 'france', 'french', 'fran├ºais'),
  298.                        'it_IT': ('it', 'it_it', 'italy', 'italian', 'italiano'),
  299.                        'ru_RU': ('ru', 'ru_ru', 'russian'),
  300.                        'pt_BR': ('pt', 'br', 'pt_br', 'brazil', 'brazilian', 'portuguese', 'brasil', 'portuguesa'),
  301.                        'es_MX': ('es', 'mx', 'es_mx', 'mexico', 'spain', 'spanish', 'espanol', 'espa├▒ol'),
  302.                      }
  303.                      
  304.                      
  305.